package com.common.app.utls

import android.text.TextUtils
import net.sourceforge.pinyin4j.PinyinHelper
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination
import java.util.*
import java.util.regex.Pattern

/**
 *
 * 作者：sosou
 *
 * 版本：1.0
 *
 * 创建日期：3/3/2023
 *
 * 描述：
 *
 * 修订历史：
 *
 */
object PinyinUtils {
    const val LOCATING = 111
    const val FAILED = 666
    const val SUCCESS = 888

    /**
     * 获取拼音的首字母（大写）
     *
     * @param pinyin
     * @return
     */
    fun getFirstLetter(pinyin: String): String {
        if (TextUtils.isEmpty(pinyin)) return "定位"
        val c = pinyin.substring(0, 1)
        val pattern = Pattern.compile("^[A-Za-z]+$")
        if (pattern.matcher(c).matches()) {
            return c.uppercase(Locale.getDefault())
        } else if ("0" == c) {
            return "定位"
        } else if ("1" == c) {
            return "热门"
        }
        return "定位"
    }

    /**
     * 提取出城市或者县
     * @param city
     * @param district
     * @return
     */
    fun extractLocation(city: String, district: String): String {
        return if (district.contains("县")) district.substring(
            0,
            district.length - 1
        ) else city.substring(0, city.length - 1)
    }

    /**
     * 将hanzi转成拼音
     *
     * @param hanzi 汉字或字母
     * @return 拼音
     */
    fun getPinyin(hanzi: String): String {
        val sb = StringBuilder()
        val format = HanyuPinyinOutputFormat()
        format.caseType = HanyuPinyinCaseType.UPPERCASE
        format.toneType = HanyuPinyinToneType.WITHOUT_TONE
        //由于不能直接对多个汉子转换，只能对单个汉子转换
        val arr = hanzi.toCharArray()
        for (i in arr.indices) {
            if (Character.isWhitespace(arr[i])) {
                continue
            }
            try {
                val pinyinArr = PinyinHelper.toHanyuPinyinStringArray(arr[i], format)
                if (pinyinArr != null) {
                    sb.append(pinyinArr[0])
                } else {
                    sb.append(arr[i])
                }
            } catch (e: Exception) {
                e.printStackTrace()
                //不是正确的汉字
                sb.append(arr[i])
            }
        }
        return sb.toString()
    }

    /**
     * [简要描述]:汉字转换位汉语拼音首字母，英文字符不变<br></br>
     * [详细描述]:汉字转换位汉语拼音首字母，英文字符不变<br></br>
     *
     * @author sosou
     * @param chines 汉字
     * @return 拼音
     */
    fun converterToFirstSpell(chines: String): String {
        var pinyinName = ""

        // 将传过来的用户名转换为字符数组
        val nameChar = chines.toCharArray()

        // 格式转换器
        val defaultFormat = HanyuPinyinOutputFormat()

        // 忽略大小写
        defaultFormat.caseType = HanyuPinyinCaseType.UPPERCASE

        // 音标
        defaultFormat.toneType = HanyuPinyinToneType.WITHOUT_TONE
        for (i in nameChar.indices) {
            // 遍历用户名字符数组长度
            if (nameChar.isNotEmpty()) {
                // 处理特殊符号，例如：¥哈哈
                if (i == 0) {
                    if (nameChar[i].toString().matches("[\\u4E00-\\u9FA5]+".toRegex())) {
                    } else {
                        // 如果是特殊字母
                        if (Character.isUpperCase(nameChar[i]) or Character.isLowerCase(
                                nameChar[i]
                            )
                        ) {
                        } else {
                            return "#"
                        }
                    }
                }

                // 如果
                if (nameChar[i].code > 128) {
                    // 是汉字
                    try {
                        val pinyinNameStart =
                            PinyinHelper.toHanyuPinyinStringArray(nameChar[i], defaultFormat)

                        //
                        if (pinyinNameStart != null && pinyinNameStart.isNotEmpty()) {
                            pinyinName += pinyinNameStart[0][0]
                        }
                    } catch (e: BadHanyuPinyinOutputFormatCombination) {
//                        L.e(e.getMessage());
                    }
                } else if (Character.isUpperCase(nameChar[i])) {
                    pinyinName += nameChar[i]
                } else if (Character.isLowerCase(nameChar[i])) {
                    pinyinName += (nameChar[i].code - 32).toChar().toString()
                }
            }
        }

        // 如果不能转换为拼音
        if (pinyinName === "") {
            pinyinName = "#"
        }
        return pinyinName
    }
}